﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ShuticsBiz;
using ShuticsEntities;
using System.Media;

namespace TPDiseño2011
{
    public partial class frmPuestos : Form
    {
        private Puesto puestoModificado { get; set; }
        private List<Competencia> competencias { get; set; }
        private string usuario;

        public frmPuestos(string usuario)
        {
            InitializeComponent();
            this.usuario = usuario;
        }

        #region Métodos pnlBusqueda
        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            SetearHabilitacionFiltros(true);            
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            Buscar();
        }

        private void Buscar()
        {
            if (txtFiltroCodigo.Text == String.Empty && txtFiltroPuesto.Text == String.Empty && txtFiltroEmpresa.Text == String.Empty)
            {
                lblErrorSeleccion.Visible = false;
                lblErrorFiltros.Visible = true;
            }
            else
            {
                SetearHabilitacionFiltros(false);
                dgvPuestos.AutoGenerateColumns = false;
                dgvPuestos.DataSource = new BindingList<Puesto>(ControlPuesto.Buscar(txtFiltroEmpresa.Text, txtFiltroPuesto.Text, txtFiltroCodigo.Text).OrderByDescending(c => c.Codigo).ToList());
            }
        }

        private void SetearHabilitacionFiltros(bool habilitado)
        {
            txtFiltroCodigo.Enabled = habilitado;
            txtFiltroPuesto.Enabled = habilitado;
            txtFiltroEmpresa.Enabled = habilitado;
            btnBuscar.Enabled = habilitado;
            btnLimpiar.Enabled = !habilitado;

            if (habilitado)
            {
                txtFiltroCodigo.Text = String.Empty;
                txtFiltroPuesto.Text = String.Empty;
                txtFiltroEmpresa.Text = String.Empty;
                txtFiltroCodigo.Focus();
            }

            lblErrorFiltros.Visible = false;
            lblErrorSeleccion.Visible = false;

            dgvPuestos.DataSource = null;
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            CargarPanelAlta();
        }

        private void CargarPanelAlta()
        {
            lblErrorFiltros.Visible = false;
            pnlBusqueda.Enabled = false;
            pnlAlta.Enabled = true;
            txtCodigo.Enabled = true;
            txtCodigo.Focus();
            cbEmpresa.DisplayMember = "Nombre";
            cbEmpresa.ValueMember = "ID";
            cbEmpresa.DataSource = ControlPuesto.GetEmpresas();

            competencias = ControlCompetencia.GetCompetencias().OrderBy(c => c.Nombre).ToList();
            for (int i = 0; i < competencias.Count; i++)
            {
                dgvCompetencias.Rows.Add();
                ((DataGridViewTextBoxCell)dgvCompetencias.Rows[i].Cells[1]).Value = competencias[i].Nombre;
                ((DataGridViewComboBoxCell)dgvCompetencias.Rows[i].Cells[2]).Value = ((DataGridViewComboBoxCell)dgvCompetencias.Rows[0].Cells[2]).Items[0];
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            lblErrorFiltros.Visible = false;
            if(dgvPuestos.SelectedRows.Count < 1)
            {
                lblErrorSeleccion.Visible = true;
            }
            else
            {
                lblErrorSeleccion.Visible = false;
                pnlBusqueda.Enabled = false;
                pnlAlta.Enabled = true;
                txtCodigo.Enabled = false;
                txtNombre.Focus();

                puestoModificado = ((List<Puesto>)dgvPuestos.DataSource)[dgvPuestos.SelectedRows[0].Index];
                cbEmpresa.DisplayMember = "Nombre";
                cbEmpresa.ValueMember = "ID";
                List<Empresa> empresas = ControlPuesto.GetEmpresas();
                cbEmpresa.DataSource = empresas;
                cbEmpresa.SelectedIndex = empresas.Single(c=> c.ID == puestoModificado.Empresa.ID && c.Nombre == puestoModificado.Empresa.Nombre).ID -1;
                txtCodigo.Text = puestoModificado.Codigo;
                txtNombre.Text = puestoModificado.Nombre;
                rtbDescripcion.Text = puestoModificado.Descripcion.ToUpper();
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            //Si no hay Puesto seleccionado, mostramos error
            if (dgvPuestos.SelectedRows.Count < 1)
            {
                lblErrorSeleccion.Visible = true;
            }
            else
            {
                //Se obtiene el puesto seleccionado a traves del origen de datos de la fila seleccionada
                Puesto puestoSeleccionado = ((Puesto)dgvPuestos.SelectedRows[0].DataBoundItem);
                
                string mensaje = "Los datos del puesto \"" + puestoSeleccionado.Nombre + "\" serán eliminados del sistema. ¿Desea continuar?";
                if(MessageBox.Show(mensaje,Messages.CAPTION,MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
                {
                    try
                    {
                        bool eliminado = ControlPuesto.Eliminar(puestoSeleccionado, usuario);
                        if (eliminado)
                        {
                            MessageBox.Show("Los datos del puesto \"" + puestoSeleccionado.Nombre + "\" han sido eliminados del sistema.", Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Information);

                            Buscar();
                        }
                        else
                        {
                            MessageBox.Show("El puesto \"" + puestoSeleccionado.Nombre + "\" está siendo usado en la base de datos y no puede eliminarse.", Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    catch (Exception)
                    {
                        MessageBox.Show("Ha ocurrido un error al eliminar el puesto \"" + puestoSeleccionado.Nombre + "\" del sistema.", Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }

        private void dgvPuestos_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (dgvPuestos.Columns[e.ColumnIndex].DataPropertyName.Contains("."))
            {
                e.Value = EvaluateValue(dgvPuestos.Rows[e.RowIndex].DataBoundItem, dgvPuestos.Columns[e.ColumnIndex].DataPropertyName);
            }
        }

        public string EvaluateValue(object obj, string property)
        {
            string prop = property;
            string ret = string.Empty;

            if (property.Contains("."))
            {
                prop = property.Substring(0, property.IndexOf("."));
                System.Reflection.PropertyInfo[] props = obj.GetType().GetProperties();

                foreach (System.Reflection.PropertyInfo propa in props)
                {
                    object obja = propa.GetValue(obj, new object[] { });

                    if (obja != null && obja.GetType().Name.Contains(prop))
                    {
                        ret = EvaluateValue(obja, property.Substring(property.IndexOf(".") + 1));
                        break;
                    }
                }
            }
            else
            {
                System.Reflection.PropertyInfo pi = obj.GetType().GetProperty(prop);
                ret = pi.GetValue(obj, new object[] { }).ToString();
            }

            return ret;
        }
        #endregion pnlBusqueda

        #region Métodos pnlAlta
        private void rtbDescripcion_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = Char.ToUpper(e.KeyChar);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            CerrarPnlAlta();
        }

        private void CerrarPnlAlta()
        {
            txtCodigo.Text = String.Empty;
            txtNombre.Text = String.Empty;
            rtbDescripcion.Text = String.Empty;
            lblCodigoRequerido.Visible = false;
            lblNombreRequerido.Visible = false;
            lblDescripcionRequerido.Visible = false;
            lblCamposRequeridos.Visible = false;
            lblCompetenciaRequerida.Visible = false;
            cbEmpresa.DataSource = null;
            btnSeleccionarTodo.Text = "Seleccionar Todo";
            int cant = dgvCompetencias.Rows.Count;            
            for(int i=0; i<cant; i++)
            {
                dgvCompetencias.Rows.RemoveAt(0);
            }
            pnlBusqueda.Enabled = true;
            pnlAlta.Enabled = false;
            txtFiltroCodigo.Focus();
        }
        
        private void btnSeleccionarTodo_Click(object sender, EventArgs e)
        {
            bool seleccionarTodo = btnSeleccionarTodo.Text.Equals("Seleccionar Todo") ? true : false;

            foreach (DataGridViewRow row in dgvCompetencias.Rows)
            {
                ((DataGridViewCheckBoxCell)row.Cells[0]).Value = seleccionarTodo;
            }

            if (seleccionarTodo)
            {
                btnSeleccionarTodo.Text = "Deseleccionar Todo";
            }
            else
            {
                btnSeleccionarTodo.Text = "Seleccionar Todo";
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            Dictionary<Competencia, int> dic = new Dictionary<Competencia, int>();
            foreach (DataGridViewRow row in dgvCompetencias.Rows)
            {
                if(((DataGridViewCheckBoxCell)row.Cells[0]).Value != null && (bool)((DataGridViewCheckBoxCell)row.Cells[0]).Value)
                {
                    dic.Add(competencias.Single(c => c.Nombre.Equals(((DataGridViewTextBoxCell)row.Cells[1]).Value.ToString())), int.Parse(((DataGridViewComboBoxCell)row.Cells[2]).Value.ToString()));
                }
            }

            Empresa emp = ((List<Empresa>)cbEmpresa.DataSource)[cbEmpresa.SelectedIndex];

            lblCodigoRequerido.Visible = txtCodigo.Text.Length != 8;
            lblNombreRequerido.Visible = txtNombre.Text.Length < 1;
            lblDescripcionRequerido.Visible = rtbDescripcion.Text.Length < 1;
            lblCompetenciaRequerida.Visible = dic.Count == 0;
            lblCamposRequeridos.Visible = lblCodigoRequerido.Visible || lblNombreRequerido.Visible || lblDescripcionRequerido.Visible;

            if (!lblCompetenciaRequerida.Visible && !lblCamposRequeridos.Visible)
            {
                try
                {
                    bool exito = ControlPuesto.Guardar(txtCodigo.Text, txtNombre.Text, rtbDescripcion.Text, emp, dic);
                    if (!exito)
                    {
                        MessageBox.Show(Messages.ERRORPUESTONOMCODIGOEXISTENTE, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                    else if (MessageBox.Show("El puesto \"" + txtNombre.Text + "\" se ha creado correctamente. ¿Desea cargar otro?", Messages.CAPTION, MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                    {
                        CerrarPnlAlta();
                        CargarPanelAlta();
                    }
                    else
                    {
                        CerrarPnlAlta();
                        if (!txtFiltroCodigo.Enabled)
                        {
                            Buscar();
                        }
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show(Messages.ERRORPUESTOGUARDAR, Messages.CAPTION, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            else
            {
                SystemSounds.Hand.Play();
            }            
        }
        #endregion pnlAlta

        private void codigo_MaskInputRejected(object sender, MaskInputRejectedEventArgs e)
        {
            toolTipCodigo.Show("Sólo se pueden caracteres con el formato [AAAA9999]", (MaskedTextBox)sender, 0, 20, 2000);
        }

        private void dgvPuestos_DataSourceChanged(object sender, EventArgs e)
        {
            bool habilitado = false;
            if (dgvPuestos.DataSource != null)
            {
                habilitado = ((BindingList<Puesto>)dgvPuestos.DataSource).Count > 0;
            }
            btnEliminar.Enabled = habilitado;
        }
    }
}
